//  Copyright Druid Mechanics

#pragma once

#include "CoreMinimal.h"
#include "AbilitySystem/Abilities/AuraDamageGameplayAbility.h"
#include "AuraProjectileSpell.generated.h"

class AAuraProjectile;
class UGameplayEffect;
struct FGameplayTag;

/**
 * 
 */
UCLASS()
class AURA_API UAuraProjectileSpell : public UAuraDamageGameplayAbility
{
	GENERATED_BODY()

protected:
	/**
	 * FGameplayAbilityActorInfo:
	 * 缓存使用此GA的Actor的相关数据。
	 *  -AActor*是从InitFromActor函数初始化的。
	 *  -能力会利用这一点来明确作用对象。例如，它并非与某个特定的行为者类紧密相连。
	 *  -这些通常作为指针进行传递，以支持多态性。
	 *  -项目能覆盖UAbilitySystemGlobals::AllocAbilityActorInfo函数从而去覆盖默认被创造的结构体类型。
	 */
	/**
	 * FGameplayAbilityActivationInfo:
	 * 与特定GA激活相关的数据。
	 *	-告诉我们是否是权威，是否是预测，确认等。
	 *	-拥有当前和之前的预测键。
	 *	-通常不打算在项目中细分。
	 *	-由于结构体较小，因此按值传递。
	 */
	/**
	 * FGameplayEventData: 基于标签的游戏玩法事件的元数据，能够激活其他能力或运行特定能力逻辑。
	 */
	virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo,
	                             const FGameplayAbilityActivationInfo ActivationInfo,
	                             const FGameplayEventData* TriggerEventData) override;
	UFUNCTION(BlueprintCallable, Category = "Projectile")
	void SpawnProjectile(const FVector& ProjectileTargetLocation, const FGameplayTag& SocketTag,
	                     bool bOverridePath = false, float PitchOverride = 0.f);

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	TSubclassOf<AAuraProjectile> ProjectileClass;

	UPROPERTY(EditDefaultsOnly)
	int32 NumProjectiles{5};
};
